#include <iostream>
#include <fstream>
#include <cstdlib>
#include <vector>
#include <sys/time.h>

using namespace std;

#include "AnalizadorDatos.h"
#include "RamificacionYPoda.h"

void muestraSol(Nodo Datos1, int Estados)
{
    vector<int> temp1 = Datos1.getSolucion();
    vector<int>::iterator it1=temp1.begin();
    cout << "Cota:" << Datos1.getCota() << endl;

    for(int i=0; i<Estados; i++)
    {
        //cout << "iterador" << *it1 << endl;
        //it1=temp1.begin()+*it1;
        cout << *it1 << "\t" ;
        it1++;
    }
    cout << endl;
    cout << "\n";
    it1=temp1.begin();
    cout << "0\t";
    for(int i=0; i<Estados; i++)
    {
        cout << *it1 << "\t" ;
        it1=*it1+temp1.begin();
    }
    cout << endl;

}

int main(int argc, char* argv[])
{
    if(argc!=2)
    {
        cout << "USO: nombre_del_programa fichero_de_datos Estructura_Datos\n";
        cout << "Vector:1\n" << "Lista:2\n" << "Queue:3\n";
        exit(1);
    }

    //~ switch (atoi(argv[2]))
    //~ {
        //~ case 1:
        {
            double duracion;
            struct timeval comienzo, final;
            gettimeofday(&comienzo,NULL);
            cout << "Solucion Vector\n";
            RamPodaVector Datos1(argv[1]);
            Datos1.RamPodaSol();
            int Estados=Datos1.getDatosProblema()->getNum_elementos();
            cout << "UsadosV: " << Datos1.getDatosProblema()->getUsados() << "\tNnodos: " << Datos1.getDatosProblema()->getNNodo() << "\tExpandidos: " << Datos1.getDatosProblema()->getExpansion() << "\tPodados: " << Datos1.getDatosProblema()->getPoda() << endl;
            muestraSol(Datos1.getNodo(), Estados);
            //~ break;
            gettimeofday(&final,NULL);
            duracion=((double)final.tv_sec+(double)final.tv_usec/1000000) - ((double)comienzo.tv_sec+(double)comienzo.tv_usec/1000000);
            cout << "duracionV: " << duracion << endl;
        }
        //~ case 2:
        {
            double duracion;
            struct timeval comienzo, final;
            gettimeofday(&comienzo,NULL);
            cout << "Solucion Lista\n";
            RamPodaLista Datos2(argv[1]);
            Datos2.RamPodaSol();
            int Estados=Datos2.getDatosProblema()->getNum_elementos();
            cout << "UsadosL: " << Datos2.getDatosProblema()->getUsados() << "\tNnodos: " << Datos2.getDatosProblema()->getNNodo() << "\tExpandidos: " << Datos2.getDatosProblema()->getExpansion() << "\tPodados: " << Datos2.getDatosProblema()->getPoda() << endl;
            muestraSol(Datos2.getNodo(), Estados);
            //~ break;
            gettimeofday(&final,NULL);
            duracion=((double)final.tv_sec+(double)final.tv_usec/1000000) - ((double)comienzo.tv_sec+(double)comienzo.tv_usec/1000000);
            cout << "duracionL: " << duracion << endl;
        }
        //~ case 3:
        {
            double duracion;
            struct timeval comienzo, final;
            gettimeofday(&comienzo,NULL);
            cout << "Solucion Queue\n";
            RamPodaQueue Datos3(argv[1]);
            Datos3.RamPodaSol();
            int Estados=Datos3.getDatosProblema()->getNum_elementos();
            cout << "UsadosQ: " << Datos3.getDatosProblema()->getUsados() << "\tNnodos: " << Datos3.getDatosProblema()->getNNodo() << "\tExpandidos: " << Datos3.getDatosProblema()->getExpansion() << "\tPodados: " << Datos3.getDatosProblema()->getPoda() << endl;
            muestraSol(Datos3.getNodo(), Estados);
            //~ break;
            gettimeofday(&final,NULL);
            duracion=((double)final.tv_sec+(double)final.tv_usec/1000000) - ((double)comienzo.tv_sec+(double)comienzo.tv_usec/1000000);
            cout << "duracionQ: " << duracion << endl;
        }
    //~ }


    return 0;
}
